import 'dart:convert';

//新得：flutter的布局，为了定义清晰，最好使用组件方法，返回组件  这样模块拆分，拼接的方式来做视图。
//  类似 include 的方式来做，增强分块组装思想，能够清晰并且可拼装布局

import 'package:color_dart/color_dart.dart';
import 'package:flutter/material.dart';
import 'package:flutter_luckin_coffee/provider/counter_model.dart';
import 'package:flutter_luckin_coffee/provider/shopping_cart_model.dart';
import 'package:flutter_luckin_coffee/utils/global.dart';
import 'package:flutter_luckin_coffee/routes/index.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
//私有变量 字符串 shoppingCart
String _shoppingCart;

//创建router变量（final） 编译期不可改变值
final router = Router();

//异步的main方法  配合 SharedPreferences的初始化 await
void main() async {
  //异步初始化 SharedPreferences 对象，方便后期进行 持久化存储
  SharedPreferences prefs = await G.prefs;
  //根据键名 shoppingCart 获取保存的字符串，意思应该是购物车的数据  保存到全局变量上 shoppingCart
  _shoppingCart = prefs.getString('shoppingCart');
  //启动app代码
  runApp(
    //管理多个app对象的管理器
    MultiProvider(
      //增加要管理的数据
      providers: [
        //Provider 是 Google I/O 2019 大会上宣布的现在官方推荐的状态管理方式，而 ChangeNotifierProvider 可以说是 Provider 的一种。
        //类似整个app共享数据的概念  保存的是计数器
        ChangeNotifierProvider.value(value: CounterModel()),
        //保存了 购物车列表数据，支持更新数据，所有地方全部更新
        ChangeNotifierProvider.value(value: ShoppingCartModel())
      ],
      //关联状态的页面对象，或者叫app展示页
      child: MyApp(),
    ),
  );
}
//app的展示封装也（）  继承了  有状态组件
class MyApp extends StatefulWidget {
  //本组件的构造函数，调用父类的 supper方法，调用父类的构造方法
  MyApp({Key key}) : super(key: key);

  //app的主要类，类似application作用，维持整个app的状态，  获取页面树
  @override
  _MyAppState createState() => _MyAppState();
}
//app页面状态变更，继承了State（状态），类型是myapp
class _MyAppState extends State<MyApp> {

  //构建app的页面状态树
 @override
  Widget build(BuildContext context) {
   //获取状态管理对象中的 购物车数据对象，
    final ShoppingCartModel _shoppingCartModel = Provider.of<ShoppingCartModel>(context);

    //有数据则进入操作，
    if(_shoppingCart != null) {
      //将购物车数据（字符串），转化为map集合，
      Map data = json.decode(_shoppingCart);
      //将map集合数据，放入到 整体的 状态保存对象内部，以实现数据变化观察，和 关联对象页面的更新
      _shoppingCartModel.init(data);
    }
    //MaterialApp 材料app的设计理念的基本壳对象，帮助稳定app的页面组件风格
    return MaterialApp(
      //在构建导航器时使用的键。
      navigatorKey: G.navigatorKey,
      //app的标题名称
      title: 'Flutter Luckin Coffee',
      //app的主题
      theme: ThemeData(
        //appbar的主题，顶部标题栏，
        appBarTheme: AppBarTheme(
          //设置动作主题颜色，
          actionsIconTheme: IconThemeData(
            color: rgba(0, 0, 0, 0),
          ),
          //设置阴影
          elevation: 0,
        ),
        
        // button去除点击后的背景，注意：对appbar中的的button无效
        // buttonTheme: ButtonThemeData(
        //   splashColor: rgba(0, 0, 0, 0),
        //   highlightColor: rgba(0, 0, 0, 0),
        // ),
      ),
      //第一个显示的路由名称，购物车
      initialRoute: '/shopping_cart',
      //调用此主题来生成各个路由界面的标题，如果是空的，就用title显示，appbar的标题栏
      onGenerateRoute: router.getRoutes,
    );
  }
}